﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ParasitoLibrary.Core.Entidade;
using ParasitoLibrary.DataAccess;

namespace ParasitoLibrary.Business.Controle
{
    public class ControleQuestao
    {

        #region .:> Singleton

        private static ControleQuestao instancia = null;
        private static object objSincronizado = new object();

        private ControleQuestao()
        {
        }

        public static ControleQuestao getInstancia()
        {
            if (instancia == null)
            {
                lock (objSincronizado)
                {
                    if (instancia == null)
                    {
                        instancia = new ControleQuestao();
                    }
                }
            }
            return instancia;
        }

        #endregion

        public IList<Questao> carregarEntidades()
        {
            return DAOQuestao.getInstancia().carregarEntidades();
        }

        public Questao consultarPorCodigo(String codigo)
        {
            return DAOQuestao.getInstancia().consultarPorCodigo(codigo);
        }

        public IList<Questao> carregarEntidades(Nivel nivel, Assunto assunto, string enunciadoPergunta)
        {
            IList<Questao> listaQuestao = this.carregarEntidades();
            IList<Questao> valorRetorno = new List<Questao>();
            Boolean isQuestaoValida = true;

            foreach(Questao questao in listaQuestao)
            {
                isQuestaoValida = true;

                if (nivel != null && !questao.Nivel.Codigo.Equals(nivel.Codigo))
                {
                    isQuestaoValida = false;
                }

                if (assunto != null && !questao.Assunto.Codigo.Equals(assunto.Codigo))
                {
                    isQuestaoValida = false;
                }

                if (enunciadoPergunta != null && enunciadoPergunta.Length > 0 && !questao.Enunciado.ToLower().Contains(enunciadoPergunta.ToLower()))
                {
                    isQuestaoValida = false;
                }

                if (isQuestaoValida)
                {
                    valorRetorno.Add(questao);
                }
            }

            return valorRetorno;
        }

        public void inserir(Questao questao)
        {
            questao.Codigo = "Q" + String.Format("{0:yyyyMMddHHmmss}", DateTime.Now);
            DAOQuestao.getInstancia().inserir(questao);
        }

        public void alterar(Questao questao, ref IList<Questao> listaQuestao)
        {
            int indiceQuestao = 0;

            DAOQuestao.getInstancia().alterar(questao);

            if (listaQuestao != null)
            {
                indiceQuestao = this.obterIndiceQuestaoColecao(questao, listaQuestao);
                listaQuestao[indiceQuestao] = questao;
            }
        }

        public void excluir(Questao questao, ref IList<Questao> listaQuestao)
        {
            int indiceQuestao = 0;

            DAOQuestao.getInstancia().excluir(questao);

            if (listaQuestao != null)
            {
                indiceQuestao = this.obterIndiceQuestaoColecao(questao, listaQuestao);
                listaQuestao.RemoveAt(indiceQuestao);
            }
        }

        private int obterIndiceQuestaoColecao(Questao questao, IList<Questao> listaQuestao)
        {
            int valorRetorno = 0;

            for (int i = 0; i < listaQuestao.Count; i++)
            {
                if (questao.Codigo.Equals(listaQuestao.ElementAt(i)))
                {
                    valorRetorno = i;
                    break;
                }
            }

            return valorRetorno;
        }
    }
}
